home *** CD-ROM | disk | FTP | other *** search
/ 3D Game Programming All in One / 3D Game Programming All in One Disc.iso / 3D2E / main.cs < prev    next >
Text File  |  2005-11-23  |  8KB  |  280 lines

  1. //-----------------------------------------------------------------------------
  2. // Torque Game Engine 
  3. // Copyright (C) GarageGames.com, Inc.
  4. //-----------------------------------------------------------------------------
  5.  
  6. $defaultGame = "demo";
  7. $displayHelp = false;
  8.  
  9.  
  10. //-----------------------------------------------------------------------------
  11. // Support functions used to manage the mod string
  12.  
  13. function pushFront(%list, %token, %delim)
  14. {
  15.    if (%list !$= "")
  16.       return %token @ %delim @ %list;
  17.    return %token;
  18. }
  19.  
  20. function pushBack(%list, %token, %delim)
  21. {
  22.    if (%list !$= "")
  23.       return %list @ %delim @ %token;
  24.    return %token;
  25. }
  26.  
  27. function popFront(%list, %delim)
  28. {
  29.    return nextToken(%list, unused, %delim);
  30. }
  31.  
  32.  
  33. //------------------------------------------------------------------------------
  34. // Process command line arguments
  35.  
  36. // Run the Torque Creator mod by default, it's needed for editors.
  37. $modcount = 2;
  38. $userMods = "creator;" @ $defaultGame;
  39.  
  40. for ($i = 1; $i < $Game::argc ; $i++)
  41. {
  42.    $arg = $Game::argv[$i];
  43.    $nextArg = $Game::argv[$i+1];
  44.    $hasNextArg = $Game::argc - $i > 1;
  45.    $logModeSpecified = false;
  46.    
  47.    switch$ ($arg)
  48.    {
  49.       //--------------------
  50.       case "-log":
  51.          $argUsed[$i]++;
  52.          if ($hasNextArg)
  53.          {
  54.             // Turn on console logging
  55.             if ($nextArg != 0)
  56.             {
  57.                // Dump existing console to logfile first.
  58.                $nextArg += 4;
  59.             }
  60.             setLogMode($nextArg);
  61.             $logModeSpecified = true;
  62.             $argUsed[$i+1]++;
  63.             $i++;
  64.          }
  65.          else
  66.             error("Error: Missing Command Line argument. Usage: -log <Mode: 0,1,2>");
  67.  
  68.       //--------------------
  69.       case "-mod":
  70.          $argUsed[$i]++;
  71.          if ($hasNextArg)
  72.          {
  73.             // Append the mod to the end of the current list
  74.             $userMods = strreplace($userMods, $nextArg, "");
  75.             $userMods = pushFront($userMods, $nextArg, ";");
  76.             $argUsed[$i+1]++;
  77.             $i++;
  78.             $modcount++;
  79.          }
  80.          else
  81.             error("Error: Missing Command Line argument. Usage: -mod <mod_name>");
  82.             
  83.       //--------------------
  84.       case "-game":
  85.          $argUsed[$i]++;
  86.          if ($hasNextArg)
  87.          {
  88.             // Set the selected mod and creator for editor stuff.
  89.             $userMods = "creator;" @ $nextArg;
  90.             $argUsed[$i+1]++;
  91.             $i++;
  92.             $modcount = 2;
  93.          }
  94.          else
  95.             error("Error: Missing Command Line argument. Usage: -game <game_name>");
  96.             
  97.       //--------------------
  98.       case "-show":
  99.          // A useful shortcut for -mod show
  100.          $userMods = strreplace($userMods, "show", "");
  101.          $userMods = pushFront($userMods, "show", ";");
  102.          $argUsed[$i]++;
  103.          $modcount++;
  104.  
  105.       //--------------------
  106.       case "-console":
  107.          enableWinConsole(true);
  108.          $argUsed[$i]++;
  109.  
  110.       //--------------------
  111.       case "-jSave":
  112.          $argUsed[$i]++;
  113.          if ($hasNextArg)
  114.          {
  115.             echo("Saving event log to journal: " @ $nextArg);
  116.             saveJournal($nextArg);
  117.             $argUsed[$i+1]++;
  118.             $i++;
  119.          }
  120.          else
  121.             error("Error: Missing Command Line argument. Usage: -jSave <journal_name>");
  122.  
  123.       //--------------------
  124.       case "-jPlay":
  125.          $argUsed[$i]++;
  126.          if ($hasNextArg)
  127.          {
  128.             playJournal($nextArg,false);
  129.             $argUsed[$i+1]++;
  130.             $i++;
  131.          }
  132.          else
  133.             error("Error: Missing Command Line argument. Usage: -jPlay <journal_name>");
  134.  
  135.       //--------------------
  136.       case "-jDebug":
  137.          $argUsed[$i]++;
  138.          if ($hasNextArg)
  139.          {
  140.             playJournal($nextArg,true);
  141.             $argUsed[$i+1]++;
  142.             $i++;
  143.          }
  144.          else
  145.             error("Error: Missing Command Line argument. Usage: -jDebug <journal_name>");
  146.  
  147.       //-------------------
  148.       case "-help":
  149.          $displayHelp = true;
  150.          $argUsed[$i]++;
  151.  
  152.       //-------------------
  153.       default:
  154.          $argUsed[$i]++;
  155.          if($userMods $= "")
  156.             $userMods = $arg;
  157.    }
  158. }
  159.  
  160. if($modcount == 0) {
  161.       $userMods = $defaultGame;
  162.       $modcount = 1;
  163. }
  164.  
  165. //-----------------------------------------------------------------------------
  166. // The displayHelp, onStart, onExit and parseArgs function are overriden
  167. // by mod packages to get hooked into initialization and cleanup. 
  168.  
  169. function onStart()
  170. {
  171.    // Default startup function
  172. }
  173.  
  174. function onExit()
  175. {
  176.    // OnExit is called directly from C++ code, whereas onStart is
  177.    // invoked at the end of this file.
  178. }
  179.  
  180. function parseArgs()
  181. {
  182.    // Here for mod override, the arguments have already
  183.    // been parsed.
  184. }   
  185.  
  186. package Help {
  187.    function onExit() {
  188.       // Override onExit when displaying help
  189.    }
  190. };
  191.  
  192. function displayHelp() {
  193.    activatePackage(Help);
  194.  
  195.       // Notes on logmode: console logging is written to console.log.
  196.       // -log 0 disables console logging.
  197.       // -log 1 appends to existing logfile; it also closes the file
  198.       // (flushing the write buffer) after every write.
  199.       // -log 2 overwrites any existing logfile; it also only closes
  200.       // the logfile when the application shuts down.  (default)
  201.  
  202.    error(
  203.       "Torque Demo command line options:\n"@
  204.       "  -log <logmode>         Logging behavior; see main.cs comments for details\n"@
  205.       "  -game <game_name>      Reset list of mods to only contain <game_name>\n"@
  206.       "  <game_name>            Works like the -game argument\n"@
  207.       "  -mod <mod_name>        Add <mod_name> to list of mods\n"@
  208.       "  -console               Open a separate console\n"@
  209.       "  -show <shape>          Launch the TS show tool\n"@
  210.       "  -jSave  <file_name>    Record a journal\n"@
  211.       "  -jPlay  <file_name>    Play back a journal\n"@
  212.       "  -jDebug <file_name>    Play back a journal and issue an int3 at the end\n"@
  213.       "  -help                  Display this help message\n"
  214.    );
  215. }
  216.  
  217.  
  218. //--------------------------------------------------------------------------
  219.  
  220. // Default to a new logfile each session.
  221. if (!$logModeSpecified) {
  222.    setLogMode(6);
  223. }
  224.  
  225. // Set the mod path which dictates which directories will be visible
  226. // to the scripts and the resource engine.
  227. setModPaths($userMods);
  228.  
  229. // Get the first mod on the list, which will be the last to be applied... this
  230. // does not modify the list.
  231. nextToken($userMods, currentMod, ";");
  232.  
  233. // Execute startup scripts for each mod, starting at base and working up
  234. function loadDir(%dir)
  235. {
  236.    setModPaths(pushback($userMods, %dir, ";"));
  237.    exec(%dir @ "/main.cs");
  238. }
  239.  
  240. echo("--------- Loading MODS ---------");
  241. function loadMods(%modPath)
  242. {
  243.    %modPath = nextToken(%modPath, token, ";");
  244.    if (%modPath !$= "")
  245.       loadMods(%modPath);
  246.  
  247.    if(exec(%token @ "/main.cs") != true){
  248.       error("Error: Unable to find specified mod: " @ %token );
  249.       $modcount--;
  250.    }
  251. }
  252. loadMods($userMods);
  253. echo("");
  254.  
  255. if($modcount == 0) {
  256.    enableWinConsole(true);
  257.    error("Error: Unable to load any specified mods");
  258.    quit();  
  259. }
  260. // Parse the command line arguments
  261. echo("--------- Parsing Arguments ---------");
  262. parseArgs();
  263.  
  264. // Either display the help message or startup the app.
  265. if ($displayHelp) {
  266.    enableWinConsole(true);
  267.    displayHelp();
  268.    quit();
  269. }
  270. else {
  271.    onStart();
  272.    echo("Engine initialized...");
  273. }
  274.  
  275. // Display an error message for unused arguments
  276. for ($i = 1; $i < $Game::argc; $i++)  {
  277.    if (!$argUsed[$i])
  278.       error("Error: Unknown command line argument: " @ $Game::argv[$i]);
  279. }
  280.